package fr.afcepf.atod20.organismedeformation.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.List;

import javax.sql.DataSource;

import org.apache.log4j.Logger;

import fr.afcepf.atod20.organismedeformation.entity.Stagiaire;

/**
 * Impl�mentation de l'acc�s aux donn�es de l'entit� {@link Stagiaire}.
 * 
 * @author stagiaire
 * 
 */
public class DaoStagiaireImpl implements IDaoStagiaire {

    /**
     * logger.
     */
    private Logger log = Logger.getLogger(DaoStagiaireImpl.class);

    /**
     * Requete d'ajout d'un Stagiaire dans la BDD.
     */
    private final String reqAjout = "INSERT INTO stagiaire "
            + "(nom,prenom,adresse,date_naissance,id_organisme) " + "VALUES (?,?,?,?,?)";
    /**
     * Indice du param�tre 'nom' dans la requete 'reqAjout'.
     */
    private final int indiceParamNom = 1;
    /**
     * Indice du param�tre 'prenom' dans la requete 'reqAjout'.
     */
    private final int indiceParamPrenom = 2;
    /**
     * Indice du param�tre 'adresse' dans la requete 'reqAjout'.
     */
    private final int indiceParamAdresse = 3;
    /**
     * Indice du param�tre 'date_naissance' dans la requete 'reqAjout'.
     */
    private final int indiceParamDateNaissance = 4;
    /**
     * Indice du param�tre 'id_organisme' dans la requete 'reqAjout'.
     */
    private final int indiceParamOrganisme = 5;

    @Override
    public Stagiaire ajouter(Stagiaire paramStagiaire) {
        DataSource ds = new DataSourceAtod20();
        Connection cnx = null;
        try {
            cnx = ds.getConnection();
            PreparedStatement pstmt = cnx.prepareStatement(reqAjout,
                    Statement.RETURN_GENERATED_KEYS);
            pstmt.setString(indiceParamNom, paramStagiaire.getNom());
            pstmt.setString(indiceParamPrenom, paramStagiaire.getPrenom());
            pstmt.setString(indiceParamAdresse, paramStagiaire.getAdresse());
            pstmt.setDate(indiceParamDateNaissance, new java.sql.Date(paramStagiaire
                    .getDateNaissance().getTime()));
            if (paramStagiaire.getOrganisme() != null) {
                pstmt.setInt(indiceParamOrganisme, paramStagiaire.getOrganisme().getId());
            } else {
                pstmt.setNull(indiceParamOrganisme, Types.NULL);
            }
            if (pstmt.executeUpdate() == 1) {
                ResultSet rs = pstmt.getGeneratedKeys();
                if (rs.next()) {
                    paramStagiaire.setId(rs.getInt(1));
                }
            }
        } catch (SQLException e) {
            log.error("ERROR dans ajouter : ", e);
        } finally {
            try {
                cnx.close();
            } catch (SQLException e) {
                log.error("ERROR dans close ajouter : ", e);
            }
        }
        return paramStagiaire;
    }

    @Override
    public List<Stagiaire> rechercher(int paramIdOrganisme) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public List<Stagiaire> rechercher(String paramNomStagiaire) {
        // TODO Auto-generated method stub
        return null;
    }

    /**
     * Requete de modification d'organisme d'un Stagiaire dans la BDD.
     */
    private final String reqRenvoi = "UPDATE stagiaire set id_organisme = null WHERE "
            + "idstagiaire = ? and id_organisme = ?";
    /**
     * indice du param�tre 'idstagiaire' dans la requete 'reqRenvoi'.
     */
    private final int indiceIdStagiaireRenvoi = 1;
    /**
     * indice du param�tre 'id_organisme' dans la requete 'reqRenvoi'.
     */
    private final int indiceIdOrganismeRenvoi = 2;

    @Override
    public Stagiaire renvoi(Stagiaire paramStagiaire) {
        DataSource ds = new DataSourceAtod20();
        try {
            Connection cnx = ds.getConnection();
            PreparedStatement pstmt = cnx.prepareStatement(reqRenvoi);
            pstmt.setInt(indiceIdStagiaireRenvoi, paramStagiaire.getId());
            pstmt.setInt(indiceIdOrganismeRenvoi, paramStagiaire.getOrganisme().getId());
            if (pstmt.executeUpdate() == 1) {
                paramStagiaire.setOrganisme(null);
            }
        } catch (SQLException e) {
            log.error("ERROR dans renvoi : ", e);
        }
        return paramStagiaire;
    }

}
